package com.common.www.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by cubebox on 2017/8/12. 移动电话、固话、邮编的校验
 */

public class FormatUtils {
    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     *
     * @param mobile 移动、联通、电信运营商的号码段
     *               <p>
     *               移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡）
     *               、150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）
     *               </p>
     *               <p>
     *               联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）
     *               </p>
     *               <p>
     *               电信的号段：133、153、180（未启用）、189
     *               </p>
     *               新增号段1、9 中国卫通电话
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean isMobile(String mobile) {
        if (mobile == null)
            return false;
        String regex = "(\\+\\d+)?1[0123456789]\\d{9}$";
        return Pattern.matches(regex, mobile);
    }

    /**
     * 区号+座机号码+分机号码
     *
     * @param fixedPhone
     * @return
     */
    public static boolean isFixedPhone(String fixedPhone) {
        if (fixedPhone == null)
            return false;
        String reg = "(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|"
                + "(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)";
        return Pattern.matches(reg, fixedPhone);
    }

    /**
     * 匹配中国邮政编码
     *
     * @param postCode 邮政编码
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean isPostCode(String postCode) {
        if (postCode == null)
            return false;
        String reg = "[1-9]\\d{5}";
        return Pattern.matches(reg, postCode);
    }

    /**
     * 验证邮箱的正则表达式
     */
    public static boolean isEmail(String email) {
        if (email == null)
            return false;
        boolean tag = true;
        final String pattern1 = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$";
        final Pattern pattern = Pattern.compile(pattern1);
        final Matcher mat = pattern.matcher(email);
        if (!mat.find()) {
            tag = false;
        }
        return tag;
    }

    /**
     * 网站格式验证
     */
    public static boolean isWebsite(String website) {
        if (website == null)
            return false;
        String reg = "^([hH][tT]{2}[pP]:/*|[hH][tT]{2}[pP][sS]:/*|[fF][tT][pP]:/*|)(([a-zA-z0-9]|-){1,}\\.){1,}[a-zA-z0-9]{1,}-*+([A-Za-z0-9-~\\/])+(\\?{0,1}(([A-Za-z0-9-~]+\\={0,1})([A-Za-z0-9-~]*)\\&{0,1})*)$";
        return Pattern.matches(reg, website);
    }

    /**
     * 格式化地址
     */
    public static String formatLocation(String location) {
        if (location == null)
            return "";
        List<String> gapList = new ArrayList<>();
        gapList.add(" ");
        gapList.add(",");
        gapList.add("，");
        // gapList.add("、");//有些地区会带顿号故去掉
        gapList.add("/");
        gapList.add("\\");
        gapList.add("`");
        gapList.add(".");
        gapList.add("。");
        gapList.add("*");
        gapList.add("^");
        gapList.add("：");
        gapList.add(":");
        gapList.add(";");
        gapList.add("；");
        gapList.add("_");
        gapList.add("——");
        gapList.add("—");
        gapList.add("+");

        if (location == null) {
            return "";
        }
        for (int i = 0; i < gapList.size(); i++) {
            location = location.replace(gapList.get(i), "-").trim();
        }
        if ("".equals(location)) {
            return "";
        }

        // 去除连续的分隔符
        String gapStr = "-";// 连续出现的字符
        int appearCount = 0;// 出现数量
        // 遍历字符串的所有字符
        for (int i = 0; i < location.length(); i++) {
            // 取得第i个字符，也可以用Character.toString(string.charAt(i));
            String s = location.substring(i, i + 1);
            if (gapStr.equals(s)) {
                appearCount++;
            } else {
                appearCount = 0;
            }
            if (appearCount >= 2) {
                // 去掉重复的符号并i--
                location = location.substring(0, i) + location.substring(i + 1, location.length());
                i--;
            }
        }

        // 去掉头尾的横杠
        if (location.indexOf("-") == 0) {
            location = location.substring(1, location.length());
        }
        if (!"".equals(location) && location.lastIndexOf("-") == location.length() - 1) {
            location = location.substring(0, location.length() - 1);
        }

        return location;
    }

    /**
     * 格式化地址
     */
    public static String formatArray(String str, String gapStr) {
        if (gapStr == null)
            return "";
        List<String> gapList = new ArrayList<>();
        gapList.add(" ");
        gapList.add("，");
        gapList.add(",");
        gapList.add("、");
        gapList.add("/");
        gapList.add("\\");
        gapList.add("`");
        gapList.add(".");
        gapList.add("。");
        gapList.add("*");
        gapList.add("^");
        gapList.add("：");
        gapList.add(":");
        gapList.add(";");
        gapList.add("；");
        gapList.add("_");
        // gapList.add("-");
        gapList.add("——");
        gapList.add("—");
        gapList.add("+");

        if (str == null) {
            return "";
        }
        for (int i = 0; i < gapList.size(); i++) {
            if (!gapList.equals(gapStr))
                str = str.replace(gapList.get(i), gapStr).trim();
        }
        if ("".equals(str)) {
            return "";
        }

        // 去除连续的分隔符
        int appearCount = 0;// 出现数量
        // 遍历字符串的所有字符
        // StringBuilder builder = new StringBuilder(phoneStr);
        for (int i = 0; i < str.length(); i++) {
            // 取得第i个字符，也可以用Character.toString(string.charAt(i));
            String s = str.substring(i, i + 1);
            if (gapStr.equals(s)) {
                appearCount++;
            } else {
                appearCount = 0;
            }
            if (appearCount >= 2) {
                // 去掉重复的符号并i--
                str = str.substring(0, i) + str.substring(i + 1, str.length());
                i--;
            }
        }

        // 去掉头尾的逗号
        if (str.indexOf(gapStr) == 0) {
            str = str.substring(1, str.length());
        }
        if (!"".equals(str) && str.lastIndexOf(gapStr) == str.length() - 1) {
            str = str.substring(0, str.length() - 1);
        }

        String[] tmp = str.split(gapStr);

        return str;
    }

    /**
     * 拆分电话列表，去除掉电话列表中的各种异样分割字符
     */
    public static List<String> getPhoneList(String phoneStr) {
        List<String> result = new ArrayList<>();

        String[] res = getPhoneString(phoneStr).split(",");
        // 装载列表
        for (int i = 0; i < res.length; i++) {
            result.add(res[i]);
        }
        return result;
    }

    /**
     * 拆分电话列表，去除掉电话列表中的各种异样分割字符
     */
    public static List<String> getPhoneList(String phoneStr, String gapStr) {
        List<String> result = new ArrayList<>();

        String[] res = getPhoneString(phoneStr, gapStr).split(gapStr);
        // 装载列表
        for (int i = 0; i < res.length; i++) {
            result.add(res[i]);
        }
        return result;
    }

    public static String getPhoneString(String phoneStr) {
        return getPhoneString(phoneStr, ",");
    }

    /***/
    public static String getPhoneString(String phoneStr, String gapStr) {
        if (gapStr == null)
            return "";
        List<String> gapList = new ArrayList<>();
        gapList.add(" ");
        gapList.add("，");
        gapList.add(",");
        gapList.add("、");
        gapList.add("/");
        gapList.add("\\");
        gapList.add("`");
        gapList.add(".");
        gapList.add("。");
        gapList.add("*");
        gapList.add("^");
        gapList.add("：");
        gapList.add(":");
        gapList.add(";");
        gapList.add("；");
        gapList.add("_");
        // gapList.add("-");
        gapList.add("——");
        gapList.add("—");
        gapList.add("+");

        if (phoneStr == null) {
            return "";
        }
        for (int i = 0; i < gapList.size(); i++) {
            if (!gapList.equals(gapStr))
                phoneStr = phoneStr.replace(gapList.get(i), gapStr).trim();
        }
        if ("".equals(phoneStr)) {
            return "";
        }

        // 去除连续的分隔符
        int appearCount = 0;// 出现数量
        // 遍历字符串的所有字符
        // StringBuilder builder = new StringBuilder(phoneStr);
        for (int i = 0; i < phoneStr.length(); i++) {
            // 取得第i个字符，也可以用Character.toString(string.charAt(i));
            String s = phoneStr.substring(i, i + 1);
            if (gapStr.equals(s)) {
                appearCount++;
            } else {
                appearCount = 0;
            }
            if (appearCount >= 2) {
                // 去掉重复的符号并i--
                phoneStr = phoneStr.substring(0, i) + phoneStr.substring(i + 1, phoneStr.length());
                i--;
            }
        }

        // 去掉头尾的逗号
        if (phoneStr.indexOf(gapStr) == 0) {
            phoneStr = phoneStr.substring(1, phoneStr.length());
        }
        if (!"".equals(phoneStr) && phoneStr.lastIndexOf(gapStr) == phoneStr.length() - 1) {
            phoneStr = phoneStr.substring(0, phoneStr.length() - 1);
        }

        String[] tmp = phoneStr.split(gapStr);

        // 循环判断是否有小于4的数，如果是的话就认为是座机把后面的字符替换为-
        for (int i = 0; i < tmp.length; i++) {
            String s = tmp[i];
            if (s.length() <= 4 && isNumeric(s)) {
                phoneStr = phoneStr.replace(s + gapStr, s + "-");
            }
            if ("null".equals(s)) {
                phoneStr = phoneStr.replace("null,", "");
                phoneStr = phoneStr.replace(",null", "");
            }
        }
        return phoneStr;
    }

    /**
     * 拆分描述词
     */
    public static List<String> getFormatList(String str) {
        return getFormatList(str, ",");
    }

    /**
     * 拆分描述词
     */
    public static List<String> getFormatList(String str, String gapStr) {
        List<String> result = new ArrayList<>();

        String[] res = getPromptString(str, gapStr).split(gapStr);
        // 装载列表
        for (int i = 0; i < res.length; i++) {
            result.add(res[i]);
        }
        return result;
    }

    /**
     * 得到描述词的string 主要是去掉了空格间隔
     */
    public static String getPromptString(String phoneStr, String gapStr) {
        if (gapStr == null)
            return "";
        List<String> gapList = new ArrayList<>();
//        gapList.add(" ");
        gapList.add("，");
        gapList.add(",");
        gapList.add("、");
        gapList.add("/");
        gapList.add("\\");
        gapList.add("`");
//        gapList.add(".");
        gapList.add("。");
//        gapList.add("*");
//        gapList.add("^");
//        gapList.add("：");
//        gapList.add(":");
//        gapList.add(";");
//        gapList.add("；");
//        gapList.add("_");
        // gapList.add("-");
//        gapList.add("——");
//        gapList.add("—");
//        gapList.add("+");

        if (phoneStr == null) {
            return "";
        }
        for (int i = 0; i < gapList.size(); i++) {
            if (!gapList.equals(gapStr))
                phoneStr = phoneStr.replace(gapList.get(i), gapStr).trim();
        }
        if ("".equals(phoneStr)) {
            return "";
        }

        // 去除连续的分隔符
        int appearCount = 0;// 出现数量
        // 遍历字符串的所有字符
        // StringBuilder builder = new StringBuilder(phoneStr);
        for (int i = 0; i < phoneStr.length(); i++) {
            // 取得第i个字符，也可以用Character.toString(string.charAt(i));
            String s = phoneStr.substring(i, i + 1);
            if (gapStr.equals(s)) {
                appearCount++;
            } else {
                appearCount = 0;
            }
            if (appearCount >= 2) {
                // 去掉重复的符号并i--
                phoneStr = phoneStr.substring(0, i) + phoneStr.substring(i + 1, phoneStr.length());
                i--;
            }
        }

        // 去掉头尾的逗号
        if (phoneStr.indexOf(gapStr) == 0) {
            phoneStr = phoneStr.substring(1, phoneStr.length());
        }
        if (!"".equals(phoneStr) && phoneStr.lastIndexOf(gapStr) == phoneStr.length() - 1) {
            phoneStr = phoneStr.substring(0, phoneStr.length() - 1);
        }

        String[] tmp = phoneStr.split(gapStr);

        return phoneStr;
    }

    /**
     * 是否为数字类型
     */
    public static boolean isNumeric(String str) {
        if (str == null)
            return false;
        if (str.length() == 0)
            return false;
        for (int i = str.length(); --i >= 0; ) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }


    /**
     * 格式化小时时间格式(只显示小时和分)
     *
     * @param time
     * @return
     */
    public static String formatRemaindHour(int time) {
        StringBuilder res = new StringBuilder();
        int hour = time / 3600;
        int minute = (time - (hour * 3600)) / 60;
        if (hour > 0) {
            res.append("提前" + hour + "小时");
            return res.toString();
        }
        if (minute > 0) {
            res.append("提前" + minute + "分钟");
            return res.toString();
        }

        return "不提醒";
    }


    /**
     * 列表装维格式化后的字符串
     */
    public static String listToFormatString(List<String> list) {
        if (list == null) {
            return "";
        }
        String str = "";
        for (int i = 0; i < list.size(); i++) {
            str += list.get(i);
            if (i != list.size() - 1) {
                str += ",";
            }
        }

        return str;
    }

    /**
     * 列表装维格式化后的字符串
     */
    public static String listToFormatString(List<String> list, String gap) {
        if (list == null) {
            return "";
        }
        String str = "";
        for (int i = 0; i < list.size(); i++) {
            str += list.get(i);
            if (i != list.size() - 1) {
                if (gap != null) {
                    str += gap;
                }
            }
        }

        return str;
    }

    /**
     * 列表装维格式化后的字符串
     */
    public static String listToFormatString2(List<Integer> list) {
        if (list == null) {
            return "";
        }
        String str = "";
        for (int i = 0; i < list.size(); i++) {
            str += list.get(i) + "";
            if (i != list.size() - 1) {
                str += ",";
            }
        }

        return str;
    }

    /**
     * 获取楼层拆分后的字符串   -  拆分
     */
    public static List<String> getLouCengList(String dou) {
        //分情况  如果有三个 -  代表负数到负数  如果有两个 -  代表负数到正数   如果只有一个 - 代表一个负数 或者正数到正数  如果没有代表只有一个数
        List<String> qujian = new ArrayList<>();
        int count = dou.replaceAll("[^-]", "").length();
        if (count == 3 || count == 2) {//代表负数到负数  或者负数到正数
            int index = dou.indexOf("-", 1);
            qujian.add(dou.substring(0, index));
            qujian.add(dou.substring(index + 1));
        } else if (count == 1) {
            if (dou.startsWith("-")) {
                qujian.add(dou);
            } else {
                qujian = FormatUtils.getFormatList(dou, "-");
            }
        } else if (count == 0) {
            qujian.add(dou);
        }
        return qujian;
    }
}